#include "GLee.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#ifdef __APPLE__
	#include <GLUT/glut.h>
#else
	#include <GL/glut.h>
#endif

int window;
GLuint triangleBufferObject;

void InitGL (int windowWidth, int windowHeight, int windowDepth, const char * windowTitle)
{
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
	glutInitWindowSize(windowWidth,windowHeight);
	window = glutCreateWindow(windowTitle);

	// Codigo de los shaders
    GLchar vertexShaderText[]=
        "void main()                               				 	"
        "{                                          				"
        "   gl_Position = vec4(gl_Vertex.xy,0.0,1.0);        	"
        "}                                          				";

    GLchar fragmentShaderText [] = 
        "void main()												"
        "{															"
        "   gl_FragColor.rgb = gl_FragCoord.xyz / vec3(800,600,1);	"
        "}															";

	const GLchar * vt = vertexShaderText;
	const GLchar * ft = fragmentShaderText;

	// Creamos 2 shaders en OpenGL
	GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
	GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);

	// Cargamos el codigo de los shaders
    glShaderSource(vshader,1,&vt,NULL);
    glShaderSource(fshader,1,&ft,NULL);

	// Los compilamos 
	glCompileShader(vshader);
	glCompileShader(fshader);

	// Creamos el shader program y unimos los shaders
	GLuint program = glCreateProgram();
	glAttachShader(program, vshader);
	glAttachShader(program, fshader);

	glLinkProgram(program);// Enlazamos el programa
	glUseProgram(program); // Indicamos que queremos usar este shader

	// Coordenadas de los puntos del triangulo en espacio de pantalla (-1,-1)...(1,1)
	float vertices[] = {
						-0.5,-0.3,
						0.5	,-0.3,
						0	,0.7
	};

	// Creamos un buffer para los vertices del triangulo
	glGenBuffers( 1, &triangleBufferObject);
	glBindBuffer( GL_ARRAY_BUFFER, triangleBufferObject);
    glBufferData( GL_ARRAY_BUFFER, sizeof(float)*6,vertices, GL_STATIC_DRAW );

	// Activamos el render de vertex arrays
	glEnableClientState(GL_VERTEX_ARRAY);
	// Indicamos de donde debe tomar los datos
	glVertexPointer(2,GL_FLOAT,0,0);
}

void keyPressed(unsigned char key, int x, int y) 
{
	const int ESCAPE=27;

	if (key == ESCAPE) 
	{ 
		glutDestroyWindow(window); 
	    exit(1);
    }
}

void DrawGLScene()
{	
	// Limpiamos la imagen con color azul
	glClearColor(0.0,0.0,1.0,1.0);
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

	// Dibujamos el triangulo en el back buffer
	glDrawArrays(GL_TRIANGLES,0, 3);
	// Intercambiamos el back y el front buffer
	glutSwapBuffers();
}

void ReSizeGLScene(int width, int height)
{
	glViewport(0, 0, width, height);		
}

int main(int argc, char ** argv) 
{
	glutInit(&argc, argv);  
	InitGL(800,600,24,"OpenGL Tutorial1");
	glutDisplayFunc(&DrawGLScene);  

	glutIdleFunc(&DrawGLScene);
	glutReshapeFunc(&ReSizeGLScene);
	glutKeyboardFunc(&keyPressed);

	glutMainLoop();  
	return 1;
}

